//  引入 express
const express = require('express')
// 引入 mysql
const mysql = require('mysql')
// 引入 cors 解决跨域
const cors = require('cors')
// 引入图片验证码模块
const svgCaptcha = require('svg-captcha')
// 引入session
// const session = require('express-session')

// 创建web服务器
const app = express()
// 设置监听端口
app.listen(9999, () => {
  console.log('服务器启动成功')
})

// 创建连接池
let pool = mysql.createPool({
  host: '127.0.0.1',
  port: '3306',
  user: 'root',
  password: '',
  // host: '110.42.175.11',
  // user: 'novel',
  // password: '3wjKGR2MwDx2nzCX',
  database: 'novel',
  multipleStatements: true, // 多条查询语句
})

// session 中间件
/*app.use(
  session({
    secret: 'keyboard cat',
    resave: true, //resave是指每次请求都重新设置session
    saveUninitialized: true,
  })
)*/

// 跨域处理
app.use(cors())

// 静态资源托管
app.use(express.static('./public'))

// post请求参数转为对象
app.use(
  express.urlencoded({
    extended: false,
  })
)

// baseURL http://110.42.175.11:9999
// 1.小说相关
// 1.1首页数据加载   书单：5 3 5 4
// 请求方式 ：get
// 地址： http://127.0.0.1:9999/v1/novel/index
app.get('/v1/novel/index', (req, res, next) => {
  let q1 =
    'select * from nov_novelinfo,nov_novelcategory where booklistId=1 && cate=cid;select * from nov_novelinfo,nov_novelcategory where booklistId=2 && cate=cid;select * from nov_novelinfo,nov_novelcategory where booklistId=3 && cate=cid;select * from nov_novelinfo,nov_novelcategory where booklistId=4 && cate=cid'
  let q2 =
    'select * from nov_novelinfo where booklistId=1;select * from nov_novelinfo where booklistId=2;select * from nov_novelinfo where booklistId=3;select * from nov_novelinfo where booklistId=4'
  pool.query(q1, (err, result) => {
    if (err) {
      next(err)
      return
    }
    console.log(result)

    let new_result = {
      hotUpdate: result[0].splice(0, 5),
      recommend: result[1].splice(0, 3),
      NewBookpreview: result[2].splice(0, 5),
      sincerelyRecommend: result[3].splice(0, 4),
    }
    res.send({ code: 200, msg: '查询成功', data: new_result })
  })
})

// 1.2 排行榜列表
// 请求方式 ：get
// 地址： http://127.0.0.1:9999/v1/novel/rank/1
// 1:热门 2:新书 3:口碑 4:完结
app.get('/v1/novel/rank/:rank', (req, res, next) => {
  // select * from nov_novelinfo,nov_novelcategory where ? && cate=cid order by rankNum
  console.log(req.params)
  pool.query('select * from nov_novelinfo,nov_novelcategory where ? && cate=cid order by rankNum', [req.params], (err, result) => {
    if (err) {
      next(err)
      return
    }
    res.send({ code: 200, msg: '查询成功', data: result })
  })
})

// 1.3 小说分类
// 请求方式 ：get
// 地址： http://127.0.0.1:9999/v1/novel/category/1
// 1 男 2 女
app.get('/v1/novel/category/:major', (req, res, next) => {
  console.log(req.params)
  pool.query('select * from nov_novelcategory where?', [req.params], (err, result) => {
    if (err) {
      next(err)
      return
    }
    res.send({ code: 200, msg: '查询成功', data: result })
  })
})

//1.4  小说分类列表
// 请求方式： get
// 地址  http://127.0.0.1:9999/v1/novel/catelist/3
app.get('/v1/novel/catelist/:cate', (req, res, next) => {
  console.log(req.params)
  pool.query('select * from nov_novelinfo,nov_novelcategory where cate=? && cate=cid', [req.params.cate], (err, result) => {
    if (err) {
      next(err)
      return
    }
    res.send({ code: 200, msg: '查询成功', data: result })
  })
})

// 1.5 小说详情
// 请求方式: get
// 地址: http://127.0.0.1:9999/v1/novel/book/3
app.get('/v1/novel/book/:id', (req, res, next) => {
  pool.query('select * from nov_novelinfo,nov_novelcategory where nov_novelinfo.id=? && cate=cid', [req.params.id], (err, result) => {
    if (err) {
      next(err)
      return
    }
    res.send({ code: 200, msg: '查询成功', data: result })
  })
})

// 1.6 搜索
// 请求方式 get
// 地址: http://127.0.0.1:9999/v1/novel/search/荒
app.get('/v1/novel/search/:keywords', (req, res, next) => {
  // console.log(req.params.keywords)
  let kw = req.params.keywords
  pool.query('select * from nov_novelinfo where author like ? or name like ? ', [`%${kw}%`, `%${kw}%`], (err, result) => {
    if (err) {
      next(err)
      return
    }
    if (result.length > 0) {
      res.send({ code: 200, msg: '搜索成功', data: result })
    } else {
      res.send({ code: 201, mag: '搜索失败' })
    }
  })
})

// 用户相关
// 2.1 svg验证码
// 请求方式: get
// 地址: http://127.0.0.1:9999/v1/user/captcha
app.get('/v1/user/captcha', (req, res, next) => {
  // 算术验证码配置参数
  let options = {
    width: 120, //宽度
    height: 55, //高度
    mathMin: 1, //表达式最小取值
    mathOperator: '+-', // 使用到的运算符
    noise: 3, // 干扰线调的数量
    color: true, // 开启字体颜色
    // background: '#ff604f', // 背景颜色
  }
  // 生成算数随机验证码
  // const cap = svgCaptcha.create()
  const cap = svgCaptcha.createMathExpr(options)
  let { data, text } = cap
  // session 存储
  // req.session.captcha = text
  // 响应类型
  res.type('svg')
  // res.send(data)
  res.send({ svg: data, text })
})

// 2.2 用户注册
// 请求方式: post
// 地址: http://127.0.0.1:9999/v1/user/reg
app.post('/v1/user/reg', (req, res, next) => {
  let obj = req.body
  console.log(obj)
  // 通过手机号查询用户是否存在
  pool.query('select * from nov_user where phone=?', [obj.phone], (err, result) => {
    if (err) {
      next(err)
      return
    }
    if (result.length > 0) {
      res.send({ code: 201, msg: '用户已存在' })
    } else {
      // 创建用户 同时创建用户书架信息
      pool.query('insert into nov_user set ?', obj, (err, result) => {
        if (err) {
          next(err)
          return
        }
        console.log(result)
        if (result.affectedRows > 0) {
          pool.query('select * from  nov_user where phone=?', [obj.phone], (err, result) => {
            res.send({ code: 200, msg: '注册成功', data: result })
          })
        }
      })
    }
  })
})

// 2.3 用户登录
// 请求方式: post
// 地址: http://127.0.0.1:9999/v1/user/login
app.post('/v1/user/login', (req, res, next) => {
  let obj = req.body
  // console.log(obj)
  pool.query('select * from nov_user where phone=? && upwd=?', [obj.phone, obj.upwd], (err, result) => {
    if (err) {
      next(err)
      return
    }
    console.log(result)
    if (result.length > 0) {
      res.send({ code: 200, msg: '登陆成功', data: result })
    } else {
      res.send({ code: 201, msg: '登陆失败' })
    }
  })
})

// 2.4更新金币数量
// 请求方式 ：put
// 地址：http://127.0.0.1:9999/v1/user/updateCoins
app.put('/v1/user/updateCoins', (req, res, next) => {
  let obj = req.body
  console.log(obj)
  pool.query('update nov_user set integral=? where id=?', [obj.integral, obj.id], (err, result) => {
    if (err) {
      next(err)
      return
    }
    // console.log(result)
    if (result.affectedRows > 0) {
      res.send({ code: 200, msg: '更新成功' })
    } else {
      res.send({ code: 201, msg: '更新失败' })
    }
  })
})

// 2.5 签到
// put
// 地址：http://127.0.0.1:9999/v1/user/signIn
app.put('/v1/user/signIn', (req, res, next) => {
  let obj = req.body
  console.log(obj)
  let sql = `update nov_user set integral=${obj.integral},days=${obj.days},continuous=${obj.continuous},date='${obj.date}' where id=${obj.id}`
  console.log(sql)
  pool.query(sql, (err, result) => {
    if (err) {
      next(err)
      return
    }
    console.log(result)
    if (result.affectedRows > 0) {
      res.send({ code: 200, msg: '更新成功' })
    } else {
      res.send({ code: 201, msg: '更新失败' })
    }
  })
})

// 2.6 加入书架
// post
// 地址 http://127.0.0.1:9999/v1/user/add
app.post('/v1/user/add', (req, res, next) => {
  console.log(req.body)
  pool.query('insert into nov_userbookshelf set?', [req.body], (err, result) => {
    if (err) {
      next(err)
      return
    }
    console.log(result)
    if (result.affectedRows > 0) {
      res.send({ code: 200, msg: '添加成功' })
    } else {
      res.send({ code: 201, msg: '添加失败' }) // ......
    }
  })
})

// 2.7 获取用户书架信息
// get
// 地址: http://127.0.0.1:9999/v1/user/bookshelf/1
app.get('/v1/user/bookshelf/:uid', (req, res, next) => {
  // console.log(req.params)
  pool.query('select * from nov_userbookshelf where uid=?', [req.params.uid], (err, result) => {
    if (err) {
      next(err)
      return
    }
    // console.log(result)
    let sql = ''
    if (result.length > 0) {
      result.forEach((item) => {
        sql += `select * from nov_novelinfo where id=${item.nid};`
      })
      console.log(sql)
      pool.query(sql, (err, result) => {
        if (err) {
          next(err)
          return
        }
        res.send({ code: 200, msg: '获取成功', data: result })
      })
    } else {
      res.send({ code: 201, msg: '获取失败' })
    }
  })
})

// 错误处理中间件
app.use((err, req, res, next) => {
  console.log(err)
  //响应服务器端错误
  //设置状态码为500
  res.status(500).send({ code: 500, msg: '服务器端错误' })
})
